在開始正式寫假文產生器前,我們先來看看哪些子命令和參數是需要定義的。
找了一下套件說明,看起來只要把這個值代入 Command 結構的 slice 即可有子命令:
app.Commands = []cli.Command{}
另外還會需要參數,比方說一次想要產生的數量有多少, app
和 Command
都有一個值域叫 Flags ,只要給它 Flag 結構的 slice 即可:
app.Flags = []cli.Flag{
cli.StringFlag{
Name: "num",
Value: "10",
Usage: "產生數量",
},
}
取 Flags 的方法如下:
func(c *cli.Context) error {
fmt.Println(c.String("num"))
return nil
}
先定義兩個子命令 generate
與 status
,而 generate
定義一個 flags 是 num
,另外把它抽出另一個函式初始化:
package main
import (
"fmt"
"os"
"github.com/urfave/cli"
)
func main() {
app := cli.NewApp()
app.Name = "Namer"
app.Commands = commands()
app.Run(os.Args)
}
func commands() []cli.Command {
return []cli.Command{
{
Name: "generate",
Usage: "產生假名",
Flags: []cli.Flag{
cli.StringFlag{
Name: "num",
Value: "10",
Usage: "產生數量",
},
},
Action: func(c *cli.Context) error {
fmt.Println("Hello Generate")
fmt.Println("Generate " + c.String("num"))
return nil
},
},
{
Name: "status",
Usage: "狀態",
Action: func(c *cli.Context) error {
fmt.Println("Hello Status")
return nil
},
},
}
}
執行:
$ go run main.go generate
Hello Generate
Generate 10
$ go run main.go generate --num 1000
Hello Generate
Generate 1000
Flags 和 Args 好像只能吃字串,不過這問題並不大,而且也蠻正常的,之後再來解吧。
詳細程式可以參考 PR Day 17